﻿using System;
using System.IO;
using System.Text;

namespace SecurityApp.Classes
{
    class FileIO
    {

        public static String bestandNaarBinair(String bestand)
        {
            StringBuilder sbInput;
            // Bestand inlezen
            using (FileStream fs = new FileStream(bestand, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                // StringBuilder aanmaken, 8x zo groot als de lengte van het origineel bestand.
                // 1 byte inlezen = 8 bits opslaan
                int bestandLengte = (int)fs.Length;
                sbInput = new StringBuilder((int)fs.Length * 8);

                // 100 bytes per keer inlezen
                byte[] invoer = new byte[100];
                int start = 0;

                // Eerste maal lezen (100 bytes)
                while (fs.Read(invoer, start, invoer.Length) != 0)
                {
                    // Ingelezen array aflopen en iedere byte omzetten naar zijn bit variant
                    foreach (byte b in invoer)
                    {
                        // Als alles is ingelezen is de StringBuilder even lang als het bestand => Break
                        if (sbInput.Length == bestandLengte * 8)
                        {
                            break;
                        }

                        // Zet de byte om naar zijn bit variant en voegt eventueel links een '0' toe
                        String bitstring = Convert.ToString(b, 2).PadLeft(8, '0');
                        sbInput.Append(bitstring);
                    }
                }
            }

            return sbInput.ToString();
        }

        public static void binairNaarBestand(String bestand, String binaireTekst)
        {
            // Bestand aanmaken
            using (FileStream fs = new FileStream(bestand, FileMode.Create,FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                // StringBuilder aanmaken met lengte 800
                // 800b / 8 = 100B
                StringBuilder sbOutput = new StringBuilder(800);
                byte[] bytes = new byte[100];
                int lengte = 800;

                // Overbodige nullen wegwerken
                binaireTekst = binaireTekst.TrimStart('0');

                // De lengte moet een veelvoud van 8 blijven dus eventueel opnieuw nullen toevoegen
                int tussenStap = (int)Math.Ceiling(binaireTekst.Length / 8.0);
                binaireTekst = binaireTekst.PadLeft(tussenStap * 8, '0');

                // In groepen van 800bits oftewel 100bytes loopen
                for (int i = 0; i <= binaireTekst.Length / 800; i++)
                {
                    // Nagaan of er wel degelijk 800bits zijn in de huidige loop
                    int overschot = binaireTekst.Length - i * 800;
                    lengte = overschot < 800 ? overschot : 800;

                    // StringBuilder vullen met de volgende reeks bits
                    sbOutput.Remove(0, sbOutput.Length);
                    sbOutput.Append(binaireTekst.Substring(i * 800, lengte));

                    // 100 maal loopen met 8bits per lus -> 100bytes
                    for (int j = 0; j < Math.Ceiling((decimal)(sbOutput.Length / 8)); j++)
                    {
                        bytes[j] = Convert.ToByte(sbOutput.ToString().Substring(j * 8, 8), 2);
                    }

                    // Wegschrijven van de 100bytes
                    fs.Write(bytes, 0, ((int)Math.Ceiling((decimal)(sbOutput.Length / 8))));
                }
            }
        }
    }
}
